const person = {
    name: "John",
    age: 30,
    address:{
        city: "New York",
        country: "USA"
    }
};

// leverage keyof typeof person get all props name to be union type
// 1.typeof person: 用于获取person对象的类型信息,即{name:string,age:number,address:{city:string,country:string}}
// 2.keyof typeof person: 用于获取person对象的所有键名的联合类型,即"name" | "age" | "address"
type PersonKeys = keyof typeof person;

// access prop safely
function getPersonProps<K extends PersonKeys>(key: K) {
    return person[key];
}
/**
 * <K extends PersonKeys>: 是 TypeScript 的泛型约束语法,用于限定范型参数K的类型范围。
 * 
 * 1. 范型参数K: 表示一个类型变了,其具体类型在函数调用时才会确定。
 * 2. 约束 extends PersonKeys: 表示K的类型必须是PersonKeys的子类型,即K必须是PersonKeys中的某个键名。即 K 只能是 'name'、'age' 或 'address' 中的一个）。
 */

getPersonProps('name'); // John
getPersonProps('age'); // 30

// 4. nested object props
type AddressKeys = keyof typeof person['address']; // city | country

